package br.com.util;

import java.io.IOException;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.util.List;

import br.com.domain.Domain;
import br.com.exception.UtilException;

public class SystemUtil {
	
	/** GERADOR DE MD5 **/	
	public static String getMD5(String value) throws UtilException {
		String retorno = "";
		
		try {
			
			if (value == null) {
				return retorno;
			}
			
			MessageDigest m = MessageDigest.getInstance("MD5");
			m.update(value.getBytes(),0,value.length());
			
			retorno = ""+ new BigInteger(1,m.digest()).toString(16);
			
		} catch (Exception e) {
			  throw new UtilException(e.getMessage());
		}
		
		
		
		return retorno;
	}
	
	public static Boolean possuiDados( List<? extends Domain> list) {
		Boolean retorno = false;
		if ( list != null ) {
			if ( list.size() > 0 ){
				retorno = true;
			}
		}
		return retorno;
	}
	
	/** POSSUI DADOS - STRING **/
	public static Boolean possuiDados(String dados) {
		Boolean retorno = false;
		if ( dados != null ) {
			if ( !dados.trim().equals("") ){
				retorno = true;
			}
		}
		return retorno;
	}
	
	/** POSSUI DADOS - OUTROS NIVEIS STRING **/
	public static Boolean possuiDadosGrupo(String dados) {
		Boolean retorno = false;
		if ( dados != null ) {
			if ( !dados.trim().equals("") &&
				 !dados.trim().equals("00")	 ){
				retorno = true;
			}
		}
		return retorno;
	}
	
	/** POSSUI DADOS - OUTROS NIVEIS STRING **/
	public static Boolean possuiDadosNiveis(String dados) {
		Boolean retorno = false;
		if ( dados != null ) {
			if ( !dados.trim().equals("") &&
				 !dados.trim().equals("000")	 ){
				retorno = true;
			}
		}
		return retorno;
	}
	
	/** POSSUI DADOS - INTEGER **/
	public static Boolean possuiDados(Integer dados) {
		Boolean retorno = false;
		if ( dados != null ) {
			if ( dados > 0 ){
				retorno = true;
			}
		}
		return retorno;
	}
	
	/** POSSUI DADOS - DOMAIN **/
	public static Boolean possuiDados(Domain domain) {
		Boolean retorno = false;
		if ( domain != null ) {
			if ( domain.getId() > 0 ){
				retorno = true;
			}
		}
		return retorno;
	}
	
	/** COMPLETA COM LADO ESQUERDO **/
	public static String completarComEsquerda(String caracter, Integer qtdeCaracteres, String base){
		if(base == null || "".equals(base))
			return null;
		
		if(qtdeCaracteres <= base.length())
			return base;
				
		StringBuilder bf= new StringBuilder();
		for(int i = 1; i <= qtdeCaracteres - base.length(); i++){
			bf.append(caracter);
		}
		return bf.append(base).toString();
	}
	
	/** COMPLETA COM LADO DIREITO **/
	public static String completarComDireita(String caracter, Integer qtdeCaracteres, String base){
		if(base == null || "".equals(base))
			return "";
		
		if(qtdeCaracteres <= base.length())
			return base;
		
		Integer acrescentar = qtdeCaracteres - base.length();
				
		for(int i = 1; i <= acrescentar; i++){
			base = base + caracter + "";
		}
		
		return base;
	}
	
	/** REMOVE CARACTER DIREITA **/
	public static String removeCaracterDireita(Character caracter, String base){
		int indexCorte = 0; 
		int posicao = base.length() - 1;
		
		for(int i = 0; i <= base.length(); i++){
						
			if ( base.charAt(posicao) != caracter ) {
				indexCorte = posicao;
				break;
			}
			posicao--;
		}
		base = base.substring(0, indexCorte + 1);
		return base;
	}
	
	/** GERAR DIGITO VERIFICADOR **/
	public static String gerarDigitoVerificador(String value) {
		if (value == null) return ""; 
		int[] aux = new int[value.length()];
		int variavel = 2;
		int total = 0;
		for (int i = aux.length - 1; i >= 0; i--) {
			aux[i] = Integer.parseInt("" + value.charAt(i));
			aux[i] = aux[i] * variavel;
			variavel++;
			if (variavel > 9)
				variavel = 2;
			total += aux[i];
		}
		if (total == 0 || total == 1)
			total = 0;
		else
			total = 11 - total;

		String digito = "" + total;

		return digito;

	}
	/** COMPLETA COM LADO ESQUERDO **/
	public static String completarComEsquerdo(String caracter, Integer qtdeCaracteres, String base){
		if(base == null)
			return "";
		
		if(qtdeCaracteres <= base.length())
			return base;
				
		StringBuffer bf = new StringBuffer();
		for(int i = 1; i <= qtdeCaracteres - base.length(); i++){
			bf.append(caracter);
		}
		return bf.append(base).toString();
	}
	
	
	
	/** RETIRAR NUMEROS DE UMA STRING **/
	public static String retirarNumeros(String value){
		value = value.replaceAll("\\d", "");
		return value;
	}
 

	/**METODO PARA TESTAR IP'S**/
	public static Boolean testeIp(String ip) {
		InetAddress address = null;
		Boolean retorno = false;
		/** Se for informado Ip nulo ou vazio o método retorna falso positivo pois
		 * faz o ping no localhost **/
		if (null == ip || ip.isEmpty()) return false;
		/**  **/

		try {
			address = InetAddress.getByName(ip);
		} catch (UnknownHostException e) {
			System.out.println("Cannot lookup host " + ip);
			retorno = false;
		}
		try {
			if (address.isReachable(5000)) {
				long nanos = 0;
				long millis = 0;
				long iterations = 0;
				while (iterations < 3) {
					++iterations;
					try {
						nanos = System.nanoTime();
						address.isReachable(500);
						nanos = System.nanoTime() - nanos;
					} catch (IOException e) {
						retorno = false;
					}
					millis = Math.round(nanos / Math.pow(10, 6));
					System.out.println("Resposta do IP: "
							+ address.getHostAddress() + " com de tempo="
							+ millis + " ms");
					try {
						Thread.sleep(Math.max(0, 1000 - millis));
						retorno = true;
					} catch (InterruptedException e) {
						retorno = false;
						break;
					}
				}
			} else {
				retorno = false;
			}
		} catch (IOException e) {
			retorno = false;
		}
		return retorno;
	}
	  
	  public static void main(String[] args) {
			System.out.println(testeIp("127.0.0.5") ? "TESTE OK!" : "FALHA");
		}


}


